/**
 ******************************************************************************
 * @file    ds3553.c
 * @brief   ds3553 program body
 ******************************************************************************
 * @attention 智能计步传感器 ds3553 集成了一个高精度、高分辨率的明皜加速度传感器，和一个 8 位低功耗嵌入式
 * 微控器的专用架构。由于其低功耗、高精度的性能优势，被广泛的应用于各种智能穿戴式计步产品,包括手环、计步鞋、计步器、
 * 运动耳机等。
 *
 * ds3553 有三种工作模式：正常模式、休眠模式和待机模式。
 * 正常模式：芯片全速运行状态，正常采集加速计数据，运行计步算法，以脉冲中断或者读寄存器方式获取计步数据。如果打开抬手
 * 亮屏功能，可通过 INT2 读取事件响应中断，典型电流在 28uA。
 * 休眠模式：芯片处于正常模式时，当静止状态的维持时间超过 15 秒，则进入休眠模式。此时芯片内部关闭数据采集和算法运算
 * 功能，加速计保持运行状态，当有动作产生时，唤醒芯片，恢复正常模式。
 * 待机模式：通过配置寄存器，可使芯片进入待机模式。此时芯片本身除保持 I2C 通信外，内部和加速计都进入休眠模式，典型
 * 电流在 1.8uA。
 *
 * I2C 操作描述
 * 通信条件：CS 拉低。
 * 开始信号：在 SCL 高电平时，检测到 SDA 下降沿。
 * 停止信号：在 SCL 低电平时，检测到 SDA 上升沿。
 * 发送数据：在 SCL 低电平时，改变 SDA 电平。
 * 接收数据：在 SCL 高电平时，SDA 必须稳定，不能变化。
 * 响应信号：每发送/接收一个字节后的一位 SCL 高电平，SDA 为低，是有效的响应信号；SDA 位高，则没有响应。
 * 备注：CS为低后需延时3ms以上才能开始I2C通讯，通信完后CS恢复为高电平；完成通信后，需延时10ms以上才能继续下次通讯
 ******************************************************************************
 */
/* Includes ------------------------------------------------------------------*/
#include "ds3553.h"

/* Private includes ----------------------------------------------------------*/
#include "i2c.h"
#include "gpio.h"
#include "debug.h"
#include "delay.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
#define DS3553_CS_L HAL_GPIO_WritePin(DS3553_CS_GPIO_Port, DS3553_CS_Pin, GPIO_PIN_RESET)
#define DS3553_CS_H HAL_GPIO_WritePin(DS3553_CS_GPIO_Port, DS3553_CS_Pin, GPIO_PIN_SET)
/* Private variables ---------------------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
/**
 * 通过I2C通讯，向ds3553寄存器写数据
 */
void DS3553_WriteReg(uint8_t regAddr, uint8_t data)
{
	/*拉低片选引脚CS电平*/
	DS3553_CS_L;

	/*延时4ms*/
	Delay_ms(4);

	/*发送数据*/
	HAL_I2C_Mem_Write(&hi2c1, DS3553_I2C_ADDR_W, regAddr, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);

	/*拉高片选引脚CS电平*/
	DS3553_CS_H;

	/*延时12ms*/
	Delay_ms(12);
}

/**
 * 通过I2C通讯，读取ds3553寄存器数据
 */
uint8_t DS3553_ReadReg(uint8_t regAddr)
{
	/*拉低片选引脚CS电平*/
	DS3553_CS_L;

	/*延时4ms*/
	Delay_ms(5);

	/*读取数据*/
	uint8_t data = 0;
	HAL_I2C_Mem_Read(&hi2c1, DS3553_I2C_ADDR_R, regAddr, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);

	/*拉高片选引脚CS电平*/
	DS3553_CS_H;

	/*延时12ms*/
	Delay_ms(12);

	return data;
}

/**
 * 初始化ds3553
 */
void DS3553_Init(void)
{
	/*发送命令，查看芯片的ID*/
//	uint8_t id = DS3553_ReadReg(DS3553_CHIP_ID);
//	LOG_DEBUG("ID:%#X\r\n", id);

	/*配置芯片参数，计步器算法，禁用中断*/
	DS3553_WriteReg(DS3553_USER_SET, (USER_SET_PEDO_1 & ~USER_SET_PULSE_EN));

	/*读取设置寄存器的值，检查设置是否正确*/
	uint8_t set = DS3553_ReadReg(DS3553_USER_SET);
	if (set == (USER_SET_PEDO_1 & ~USER_SET_PULSE_EN))
	{
//		LOG_DEBUG("DS3553初始化成功");
	}
	else
	{
//		LOG_DEBUG("DS3553初始化失败");
	}
}

/**
 * 读取计步器数值
 */
uint32_t DS3553_readStepCount(void)
{
	uint32_t stepCount_L = DS3553_ReadReg(DS3553_STEP_CNT_L);
	uint32_t stepCount_M = DS3553_ReadReg(DS3553_STEP_CNT_M);
	uint32_t stepCount_H = DS3553_ReadReg(DS3553_STEP_CNT_H);

	uint32_t stepCount = (stepCount_H << 16) | (stepCount_M << 8) | stepCount_L;

//	LOG_DEBUG("step count:%lu\r\n", (unsigned long)stepCount);
	return stepCount;

}
